import router from '@/router';
import {progress} from "@/utils/progress.js";
import {useRouteStore, useUserStore} from '@/store';
import {isHttp} from "@/utils/validate.js";
import {getToken} from '@/utils/auth';

/**
 * 根据 菜单树 数据 生成 路由树
 *
 * @param menuList
 */
export const createRouteByTree = (menuList) => {
    return menuList.map(menu => {
        return menu;
    });
}

/**
 * 网站 设置 标题
 * @param title 标题
 */
const setDocumentTitle = (title) => {
    document.title = `book-admin-${title}`;
}

/** 免登录白名单 */
const whiteList = ['/login', '/register'];

/** 是否已经生成过路由表 */
let hasRouteFlag = false
export const resetHasRouteFlag = () => {
    hasRouteFlag = false
}

export const permissionController = async (to, from, next) => {
    progress().start();
    const {meta} = to;
    // 全局设置标题
    setDocumentTitle(meta.title);
    // 判断该用户是否登录
    if (getToken()) {
        if (to.path === "/login") {
            // 如果已经登录，并准备进入 Login 页面，则重定向到主页
            next();
        } else {
            if (!hasRouteFlag) {
                const routeStore = useRouteStore();
                const accessRoutes = await routeStore.generateRouteTree();
                accessRoutes.forEach((route) => {
                    if (!isHttp(route.path)) {
                        router.addRoute(route); // 动态添加可访问路由表
                    }
                });
                // 确保添加路由已完成
                hasRouteFlag = true;
                // 设置 replace: true, 因此导航将不会留下历史记录
                next({...to, replace: true});
            } else {
                next();
            }
        }
    } else {
        // 如果没有 Token
        if (whiteList.includes(to.path)) {
            // 如果在免登录的白名单中，则直接进入
            next();
        } else {
            // 其他没有访问权限的页面将被重定向到登录页面
            next('/login');
        }
    }
};